package ar.edu.utn.frba.dds.opendesigners.user;

import ar.edu.utn.frba.dds.opendesigners.ParametroBusqueda;
import ar.edu.utn.frba.dds.opendesigners.almacenamiento.Historial;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionAerolineaInvalida;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionAsientoInvalido;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionNegocio;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionReservaAsiento;
import ar.edu.utn.frba.dds.opendesigners.resultados.ResultadoBusqueda;
import ar.edu.utn.frba.dds.opendesigners.resultados.Asiento;

public class Usuario {
	private Historial historial;
	private String nombre;
	private String apellido;
	private String dni;
	private Suscripcion suscripcion;

	public Usuario(String nombre, String apellido, String dni , Suscripcion tipo) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.dni = dni;
		this.suscripcion = tipo;
		this.historial = new Historial();
	}

	public void setSuscripcion(Suscripcion suscripcion) {
		this.suscripcion = suscripcion;
	}

	public ResultadoBusqueda buscar(ParametroBusqueda parametroBusqueda){ 
		this.historial.recordLog(this.apellido, this.nombre, this.dni, parametroBusqueda);
		return this.suscripcion.buscar(parametroBusqueda);
	}
	
	public void comprar(Asiento asiento){
		try {			
			this.suscripcion.comprar(asiento);
		} catch (ExcepcionAsientoInvalido asientoInvalido) {
			throw new ExcepcionNegocio("Asiento comprado o reservado");
		}catch (ExcepcionAerolineaInvalida aerolineaInvalida) {
			//Esta esta relacionada con la VISTA, mas que con el Usuario del sistema		
			throw new ExcepcionNegocio("Aerolinea invalida");
		}
	}

	public void reservar(Asiento asiento) {
		try {			
			this.suscripcion.reservar(asiento, this);
		} catch (ExcepcionReservaAsiento e) {
			throw new ExcepcionNegocio("Asiento vendido, no se puede reservar");
		}
	}

	public String getDni() {
		return this.dni;
	}
}
